package com.zwan.oam_rtc.utils.file;

import lombok.extern.java.Log;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by ZD on 2017/6/23.
 */
@Slf4j
public class FileUtil {


    public static void createfile(String filepath){
        File file = new File(filepath);
        if(!file.exists()){
            //先得到文件的上级目录，并创建上级目录，在创建文件
            file.getParentFile().mkdirs();
            try {
                //创建文件
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    // 判断文件夹是否存在
    public static boolean judeDirExists(String dir) {

        File file = new File(dir);
        if (file.exists() && file.isDirectory()) {
            log.info(dir+" is exist");
            return true;
        }
        log.info(dir+" is not exist");
        return false;
    }

    //创建文件夹
    public static void createDir(String dir){
        File file = new File(dir);
        if (!file.exists()) {
            file.mkdir();
        }
    }

    //拷贝文件夹

    public static void copyDir(String oldPath, String newPath) throws IOException {
        File file = new File(oldPath);
        String[] filePath = file.list();

        if (!(new File(newPath)).exists()) {
            (new File(newPath)).mkdirs();
        }

        for (int i = 0; i < filePath.length; i++) {
            if ((new File(oldPath + File.separator + filePath[i])).isDirectory()) {
                copyDir(oldPath  + File.separator + filePath[i], newPath  + File.separator + filePath[i]);
            }

            if (new File(oldPath  + File.separator + filePath[i]).isFile()) {
                copyFile(oldPath + File.separator + filePath[i], newPath + File.separator + filePath[i]);
            }
        }
    }

    //拷贝文件

    public static void copyFile(String oldPath, String newPath) throws IOException {
        System.out.println("copyFile: "+ oldPath+" -> "+newPath);
        File from = new File(oldPath);
        File to = new File(newPath);
        Files.copy(from.toPath(), to.toPath());
    }



    public static List<String> getDir(String dir) {
        log.info("getDir for :"+dir);
        File f = new File(dir);
        File[] files = f.listFiles();
        List<String> dirs = new ArrayList<>();
        for (int i = 0; i < files.length; i++) {
            log.info("getDir in :"+files[i].getPath());
            if (files[i].isDirectory() && !(files[i].getPath().contains("/manager") || files[i].getPath().contains("/template"))) {
                String path= files[i].getName();
                log.info("getDir:"+path);
                dirs.add(path);
            }
        }
        return dirs;
    }

    @Deprecated
    public static void deleteAllDir(String managerDir){
        List<String> dirs = getDir(managerDir+"..");
        for(String dir:dirs){
            log.info("deleteAllDir: delete: "+ managerDir+ "../"+dir);
            deleteDirectory(managerDir+ "../"+dir);
        }
    }

    /**
     * 删除文件，可以是文件或文件夹
     *
     * @param fileName
     *            要删除的文件名
     * @return 删除成功返回true，否则返回false
     */
    public static boolean delete(String fileName) {
        File file = new File(fileName);
        if (!file.exists()) {
            log.info("删除文件失败:" + fileName + "不存在！");
            return false;
        } else {
            if (file.isFile())
                return deleteFile(fileName);
            else
                return deleteDirectory(fileName);
        }
    }

    /**
     * 删除单个文件
     *
     * @param fileName
     *            要删除的文件的文件名
     * @return 单个文件删除成功返回true，否则返回false
     */
    public static boolean deleteFile(String fileName) {
        File file = new File(fileName);
        // 如果文件路径所对应的文件存在，并且是一个文件，则直接删除
        if (file.exists() && file.isFile()) {
            if (file.delete()) {
                log.info("删除单个文件" + fileName + "成功！");
                return true;
            } else {
                log.info("删除单个文件" + fileName + "失败！");
                return false;
            }
        } else {
            log.info("删除单个文件失败：" + fileName + "不存在！");
            return false;
        }
    }

    /**
     * 删除目录及目录下的文件
     *
     * @param dir
     *            要删除的目录的文件路径
     * @return 目录删除成功返回true，否则返回false
     */
    public static boolean deleteDirectory(String dir) {
        log.info("deleteDirectory:"+dir);
        // 如果dir不以文件分隔符结尾，自动添加文件分隔符
        if (!dir.endsWith(File.separator))
            dir = dir + File.separator;
        File dirFile = new File(dir);
        // 如果dir对应的文件不存在，或者不是一个目录，则退出
        if ((!dirFile.exists()) || (!dirFile.isDirectory())) {
            log.info("删除目录失败：" + dir + "不存在！");
            return false;
        }
        boolean flag = true;
        // 删除文件夹中的所有文件包括子目录
        File[] files = dirFile.listFiles();
        for (int i = 0; i < files.length; i++) {
            // 删除子文件
            if (files[i].isFile()) {
                flag = deleteFile(files[i].getAbsolutePath());
                if (!flag)
                    break;
            }
            // 删除子目录
            else if (files[i].isDirectory()) {
                flag = deleteDirectory(files[i]
                        .getAbsolutePath());
                if (!flag)
                    break;
            }
        }
        if (!flag) {
            log.info("删除目录失败！");
            return false;
        }
        // 删除当前目录
        if (dirFile.delete()) {
            log.info("删除目录" + dir + "成功！");
            return true;
        } else {
            return false;
        }
    }

    public static void config(String dir, String sipaccount, String password, String akid, String aksecret, String vocid, String lang){
        try {
            List<String> lines = Files.readAllLines(Paths.get(dir+"/ai.properties"));
            for (int i = 0; i < lines.size(); i++) {
                String line = lines.get(i);
                if(line.startsWith("contact_user")){
                    lines.remove(i);
                    lines.add(i, "contact_user="+sipaccount);
                }
                if(line.startsWith("passwd")){
                    lines.remove(i);
                    lines.add(i, "passwd="+password);
                }
                if(line.startsWith("akid")){
                    lines.remove(i);
                    lines.add(i, "akid="+akid);
                }
                if(line.startsWith("aksecret")){
                    lines.remove(i);
                    lines.add(i, "aksecret="+aksecret);
                }
                if(line.startsWith("vocid")){
                    lines.remove(i);
                    lines.add(i, "vocid="+vocid);
                }

                if(line.startsWith("lang")){
                    lines.remove(i);
                    if(lang.equals("mandarin"))
                        lines.add(i, "lang=1");
                    else if(lang.equals("sichuang"))
                        lines.add(i, "lang=2");
                    else if(lang.equals("canton"))
                        lines.add(i, "lang=3");
                }
            }
            Files.write(Paths.get(dir+"/ai.properties"), lines);
        } catch (IOException e) {
            log.info("config:" + e.toString());
        }
    }

    public static void deleteAllDirV2(String rootdir) {
        log.info("deleteAllDirV2 process:" + rootdir);
        deleteDirectory(rootdir);
    }


}
